home *** CD-ROM | disk | FTP | other *** search
- /* logic.c */
-
- /*
- * Mesa 3-D graphics library
- * Version: 1.2
- * Copyright (C) 1995 Brian Paul (brianp@ssec.wisc.edu)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-
- /*
- $Id: logic.c,v 1.9 1995/10/30 15:32:41 brianp Exp $
-
- $Log: logic.c,v $
- * Revision 1.9 1995/10/30 15:32:41 brianp
- * added mask argument to DD.read_index_pixels call
- *
- * Revision 1.8 1995/08/31 21:27:13 brianp
- * call DD.read_index_span instead of dd_read_index_span
- * introduced CC.NewState convention
- *
- * Revision 1.7 1995/05/22 21:02:41 brianp
- * Release 1.2
- *
- * Revision 1.6 1995/05/12 16:57:22 brianp
- * replaced CC.Mode!=0 with INSIDE_BEGIN_END
- *
- * Revision 1.5 1995/03/24 17:00:38 brianp
- * added gl_update_pixel_logic
- *
- * Revision 1.4 1995/03/08 15:10:02 brianp
- * added support for dd_logicop
- *
- * Revision 1.3 1995/03/07 18:32:09 brianp
- * added gl_logic_pixels()
- *
- * Revision 1.2 1995/03/04 19:29:44 brianp
- * 1.1 beta revision
- *
- * Revision 1.1 1995/02/24 14:24:47 brianp
- * Initial revision
- *
- */
-
-
- /* color-index pixel logic operations */
-
-
- #include "context.h"
- #include "dd.h"
- #include "list.h"
- #include "macros.h"
- #include "pb.h"
-
-
-
- void gl_logicop( GLenum opcode )
- {
- if (INSIDE_BEGIN_END) {
- gl_error( GL_INVALID_OPERATION, "glLogicOp" );
- return;
- }
- switch (opcode) {
- case GL_CLEAR:
- case GL_SET:
- case GL_COPY:
- case GL_COPY_INVERTED:
- case GL_NOOP:
- case GL_INVERT:
- case GL_AND:
- case GL_NAND:
- case GL_OR:
- case GL_NOR:
- case GL_XOR:
- case GL_EQUIV:
- case GL_AND_REVERSE:
- case GL_AND_INVERTED:
- case GL_OR_REVERSE:
- case GL_OR_INVERTED:
- CC.Color.LogicOp = opcode;
- CC.NewState = GL_TRUE;
- return;
- default:
- gl_error( GL_INVALID_ENUM, "glLogicOp" );
- return;
- }
- }
-
-
-
-
- void glLogicOp( GLenum opcode )
- {
- if (CC.CompileFlag) {
- gl_save_logicop( opcode );
- }
- if (CC.ExecuteFlag) {
- gl_logicop( opcode );
- }
- }
-
-
-
- /*
- * Apply the current logic operator to a span of pixels. This is only
- * used if the device driver can't do logic ops.
- */
- void gl_logic_span( GLuint n, GLint x, GLint y, GLuint index[],
- GLubyte mask[] )
- {
- GLuint dest[MAX_WIDTH];
- GLuint i;
-
- /* Read dest values from frame buffer */
- (*DD.read_index_span)( n, x, y, dest );
-
- switch (CC.Color.LogicOp) {
- case GL_CLEAR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = 0;
- }
- }
- break;
- case GL_SET:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = 1;
- }
- }
- break;
- case GL_COPY:
- /* do nothing */
- break;
- case GL_COPY_INVERTED:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !index[i];
- }
- }
- break;
- case GL_NOOP:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = dest[i];
- }
- }
- break;
- case GL_INVERT:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !dest[i];
- }
- }
- break;
- case GL_AND:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] &= dest[i];
- }
- }
- break;
- case GL_NAND:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !(index[i] & dest[i]);
- }
- }
- break;
- case GL_OR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] |= dest[i];
- }
- }
- break;
- case GL_NOR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !(index[i] | dest[i]);
- }
- }
- break;
- case GL_XOR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] ^= dest[i];
- }
- }
- break;
- case GL_EQUIV:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !(index[i] ^ dest[i]);
- }
- }
- break;
- case GL_AND_REVERSE:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = index[i] & !dest[i];
- }
- }
- break;
- case GL_AND_INVERTED:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !index[i] & dest[i];
- }
- }
- break;
- case GL_OR_REVERSE:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = index[i] | !dest[i];
- }
- }
- break;
- case GL_OR_INVERTED:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !index[i] | dest[i];
- }
- }
- break;
- default:
- gl_error( GL_INVALID_ENUM, "gl_logic error" );
- }
- }
-
-
-
- /*
- * Apply the current logic operator to an array of pixels. This is only
- * used if the device driver can't do logic ops.
- */
- void gl_logic_pixels( GLuint n, const GLint x[], const GLint y[],
- GLuint index[], GLubyte mask[] )
- {
- GLuint dest[PB_SIZE];
- GLuint i;
-
- /* Read dest values from frame buffer */
- (*DD.read_index_pixels)( n, x, y, dest, mask );
-
- switch (CC.Color.LogicOp) {
- case GL_CLEAR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = 0;
- }
- }
- break;
- case GL_SET:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = 1;
- }
- }
- break;
- case GL_COPY:
- /* do nothing */
- break;
- case GL_COPY_INVERTED:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !index[i];
- }
- }
- break;
- case GL_NOOP:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = dest[i];
- }
- }
- break;
- case GL_INVERT:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !dest[i];
- }
- }
- break;
- case GL_AND:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] &= dest[i];
- }
- }
- break;
- case GL_NAND:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !(index[i] & dest[i]);
- }
- }
- break;
- case GL_OR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] |= dest[i];
- }
- }
- break;
- case GL_NOR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !(index[i] | dest[i]);
- }
- }
- break;
- case GL_XOR:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] ^= dest[i];
- }
- }
- break;
- case GL_EQUIV:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !(index[i] ^ dest[i]);
- }
- }
- break;
- case GL_AND_REVERSE:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = index[i] & !dest[i];
- }
- }
- break;
- case GL_AND_INVERTED:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !index[i] & dest[i];
- }
- }
- break;
- case GL_OR_REVERSE:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = index[i] | !dest[i];
- }
- }
- break;
- case GL_OR_INVERTED:
- for (i=0;i<n;i++) {
- if (mask[i]) {
- index[i] = !index[i] | dest[i];
- }
- }
- break;
- default:
- gl_error( GL_INVALID_ENUM, "gl_logic_pixels error" );
- }
- }
-